<?php
/**
 * Created by PhpStorm.
 * User: 曹旺
 * Date: 2018-04-23
 * Time: 13:38
 */

namespace app\index\controller;
header("Access-Control-Allow-Origin: *");
header("content-type:text/html;charset=utf-8");
use app\index\model\pay\H5pay;
use think\Db;
class Wxpay extends Base{
    public function pcpay(){
        $user_id = input('post.user_id');
        $order_id = input('post.order_id');
        $key = input('post.sign');
        $token = input('post.token');
        //return $user_id.'user_id'.$order_id.'order_id'.$key.'sign'.$token.'token';
        $value = 'http://pay.importndsf.com/import_nbsm/nbsm_shopping/public/index.php/index/Wxpay/pcpay';
        $sign_pass = $this->encryption($key, $value);
        if (!$sign_pass) {
            $result_json = ['code' => 199, 'msg' => '签名失败', 'content' => '管理员正在处理'];
            return json_encode($result_json);
        }
        $token_pass = $this->encryption_token($token);
        if (!$token_pass) {
            $result_json = ['code' => 198, 'msg' => '没有登录', 'content' => '管理员正在处理'];
            return json_encode($result_json);
        }
        $order_info=$this->order_info($order_id,$user_id);
        $model=new \app\index\model\pay\Wxpay();
        $arr=$model->pay($order_info);
        if ($arr){
            $json_result=['code'=>200,'msg'=>'请求成功','content'=>['money'=>$order_info['money'],'url'=>$arr]];
            return json_encode($json_result);
        }else{
            $result_json = ['code' => 0, 'msg' => '请求成功', 'content' => '数据为空'];
            return json_encode($result_json);
        }

    }
    /**
     * @param $order_id
     * @param $user_id
     * @return array|false|mixed|\PDOStatement|string|\think\Model
     * 获取订单金额和订单号
     * @author  曹旺
     * @data  15:52
     */
    public function order_info($order_id,$user_id){
        $order_info=Db::table('nbsm_order')->field('id,user_id,money,order_number')->where(['id'=>$order_id,'user_id'=>$user_id])->find();
        return $order_info;
    }
    /**
     *生成微信的二维码
     *author leesin.
     *date 2018/3/26
     */
    public function qrcode($url){
        //require_once Yii::getAlias('@vendor/wxpay/example/phpqrcode/phpqrcode.php');
        require_once(dirname(__FILE__).'/'."../extend/wxpay/example/phpqrcode/phpqrcode.php");
        \QRcode::png(urldecode($url));
    }
    /**
     * @return string
     * 下单的回调函数
     * @author  曹旺
     * @data  15:51
     */
    public function notify()
    {
        $data = file_get_contents('php://input');
        //文件日志
        Pay::fileLog($data, 'Pcnotify.log');
        //自定义参数
        //$data = 'params=eyJ1aWQiOjYsIm9yZGVyTnVtYmVyIjoiVzAzMjMwOTE2NDU2MDA5MSIsIm1ldGhvZCI6ImFsaXBheSJ9&gmt_create=2018-03-23+09%3A23%3A55&charset=UTF-8&gmt_payment=2018-03-23+09%3A23%3A59&notify_time=2018-03-23+09%3A23%3A59&subject=%E4%B8%AD%E5%BD%A7%E7%89%8C%E7%85%A7%E8%AE%A2%E5%8D%95&sign=ViRJXK80%2FtaStPno0BbhIWIceWBrQulFxbWbkvPpa4D%2FqYNLifmw3nANMB%2FdLBeFWO1ojfXClw5tXXXD3M%2Ff1ZqC5UOu2BBK%2BdSfsFphE%2BnhlBpyuLWhmwe80Cz%2FgppONIjI8PsQO4q0EgJ9Qvsd7qICAjiR5YqIcoa3DZjL4rzwkDxxq8UebTPF78KOmVvLz2bvzzV6%2BE5YuJA8No5Lo5eYgunISu0kafuvOaEMBlzE8%2FKsVIVxVCuq55GbBefu7tz1YvEWtHUtuBtHBHcDzJiyN4xXd7hR9OhhYIivz%2FvS8HUhLQSD%2BgGdQ8Kk%2FHRYzNEJIPjPHacG5BwO8QcVdw%3D%3D&buyer_id=2088112217380294&body=%E4%B8%AD%E5%BD%A7%E7%89%8C%E7%85%A7%E8%AE%A2%E5%8D%95&invoice_amount=0.01&version=1.0&notify_id=59e2c9cfaab8e656673bb68821caf3ei8p&fund_bill_list=%5B%7B%22amount%22%3A%220.01%22%2C%22fundChannel%22%3A%22ALIPAYACCOUNT%22%7D%5D&notify_type=trade_status_sync&out_trade_no=W032309164560091&total_amount=0.01&trade_status=TRADE_SUCCESS&trade_no=2018032321001004290559506068&auth_app_id=2018032202425729&receipt_amount=0.01&point_amount=0.00&app_id=2018032202425729&buyer_pay_amount=0.01&sign_type=RSA2&seller_id=2088921759977422';
        $params = $this->decodeParams($this->getNotifyParams($data));
        Pay::fileLog($params, 'Pcparams.log');
        //处理订单（与h5一样调用h5处理订单的方法）
        $H5Model = new H5pay();
        //$key = '9JTOvroPhcxaAnosVXkwGtWlilsCkkOR';
        $result = $H5Model->notify($data, $params);
        return $result;

    }
    /**
     * @param $data微信传的参数 （下单时自定义的参数）
     * @return \SimpleXMLElement[]|string
     * 获取通知数据
     * @author  曹旺
     * @data  15:52
     */
    public function getNotifyParams($data)
    {
        $xml_parser = xml_parser_create();
        if (!xml_parse($xml_parser, $data, true)) {
            //支付宝数据
            parse_str($data, $data);
            $params = urldecode($data['params']);
        } else {
            //微信数据
            $obj = simplexml_load_string($data);
            $params = $obj->attach;

        }
        return $params;
    }

    /**
     * 编码自定义参数
     */
    public function attach($order_id, $user_id, $order_number)
    {
        return base64_encode(json_encode(['user_id' => $user_id, 'order_id' => $order_id, 'order_number' => $order_number]));
        //return base64_encode(json_encode(['uid'=>$this->uid, 'orderNumber'=>$this->orderNumber, 'method'=>$this->method]));
    }

    /**
     * 解码自定义参数
     * author caowang.
     * date 2018/3/22
     */
    public static function decodeParams($params)
    {
        return json_decode(base64_decode($params), true);
    }

}
//use think\controller;
//class Wxpay extends Controller
//{
//    private $app_id = 'xxxxxxxxx';//appid和app_secret在开通微信支付后接收到的邮件里面可看到
//
//    private $mch_id = '123456790';//商户号
//
//    private $makesign = 'sahdasfjasfdasdfasdfasdfasfdafd';//支付的签名，32位签名，微信商户后台设置
//
//    private $app_secret = 'hsisdidfdkkdkd';
//
//    private $parameters;
//
//    private $notify_url='http://www.mingtern.com';// 本控制器下面的 notifyurl  方法的URL路径 记得格式 是 http://......    【这是回调】
//
//    public $error = 0;
//
//    public $orderid =  null;
//
//    #选择支付方式#
//    #记得填写授权目录
//    public function getuserinfo(){
//        $appid  = "";
//        $secret = "";
//
//        //这里获取到了code
//        $code   = $_GET['code'];
//
//        //第一步:取得openid
//        $oauth2Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
//        $oauth2 = $this->http_curl($oauth2Url);
//        //accestoken
//        $access_token = $oauth2["access_token"];
//        //openid
//        $openid = $oauth2['openid'];
//
//
//        //第二步:根据全局access_token和openid查询用户信息
//        $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
//        $userinfo = $this->http_curl($get_user_info_url);
//
//        dump($userinfo);
//        //打印用户信息
//
//    }
//    public function getcode(){
//        //基本配置
//        $appid='';
//        $redirect_uri=urlencode("https://授权回调页面域名/plugs/task/getuserinfo");
//        $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
//        header("location:".$url);
//    }
//    function http_curl($url){
//        //用curl传参
//        $ch = curl_init();
//        curl_setopt($ch, CURLOPT_URL, $url);
//        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//
//        //关闭ssl验证
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//
//
//        curl_setopt($ch,CURLOPT_HEADER, 0);
//        $output = curl_exec($ch);
//        curl_close($ch);
//        return json_decode($output, true);
//    }
//    public function wxpay()
//    {
//        //$open_id = $this->GetOpenid();
//        $open_id = 'hsdudf67dshd12';//这里是用户的open_id
//
//        #支付前的数据配置
//        $reannumb = $this->randomkeys(4).time().$this->randomkeys(4);
//
//        //这里写插入语句
//        $money = $params['money'];
//        $conf = $this->payconfig('mdxz'.$reannumb, $money*100, '订单支付', $open_id);
//
//        if (!$conf || $conf['return_code'] == 'FAIL') exit("<script>alert('对不起，微信支付接口调用错误!" . $conf['return_msg'] . "');history.go(-1);</script>");
//
//        $this->orderid = $conf['prepay_id'];
//
//        //生成页面调用参数
//
//        $jsApiObj["appId"] = $conf['appid'];
//        $timeStamp = time();
//        $jsApiObj["timeStamp"] = "$timeStamp";
//        $jsApiObj["nonceStr"] = $this->createNoncestr();
//        $jsApiObj["package"] = "prepay_id=" . $conf['prepay_id'];
//        $jsApiObj["signType"] = "MD5";
//        $jsApiObj["paySign"] = $this->MakeSign($jsApiObj);
//        return json_encode($jsApiObj);
//    }
//
//    //回调
//    public function actionNotifyurl()
//    {
//        $xml = file_get_contents("php://input");
//        $log = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
//        $id = $log['out_trade_no'];  //获取单号
//
//        //这里修改状态
//        exit('SUCCESS');  //打死不能去掉
//    }
//
//    #微信JS支付参数获取#
//    protected function payconfig($no, $fee, $body, $open_id)
//    {
//        $openid = $open_id;
//        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//        $data['appid'] = $this->app_id;
//        $data['mch_id'] = $this->mch_id; //商户号
//        $data['device_info'] = 'WEB';
//        $data['body'] = $body;
//        $data['out_trade_no'] = $no; //订单号
//        $data['total_fee'] = $fee; //金额
//        $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];
//        $data['notify_url'] = $this->notify_url;           //通知url
//        $data['trade_type'] = 'JSAPI';
//        $data['openid'] = $openid;   //获取openid
//        $data['nonce_str'] = $this->createNoncestr();
//        $data['sign'] = $this->MakeSign($data);
//
//        $xml = $this->ToXml($data);
//
//        $curl = curl_init(); // 启动一个CURL会话
//        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
//        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
//        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//
//        //设置header
//        curl_setopt($curl, CURLOPT_HEADER, FALSE);
//
//        //要求结果为字符串且输出到屏幕上
//        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//        curl_setopt($curl, CURLOPT_POST, TRUE); // 发送一个常规的Post请求
//        curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); // Post提交的数据包
//        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
//        $tmpInfo = curl_exec($curl); // 执行操作
//        curl_close($curl); // 关闭CURL会话
//        $arr = $this->FromXml($tmpInfo);
//
//        return $arr;
//    }
//
//    /**
//     *  作用：产生随机字符串，不长于32位
//     */
//
//    public function createNoncestr($length = 32)
//    {
//        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
//        $str = "";
//        for ($i = 0; $i < $length; $i++)
//        {
//            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
//        }
//
//        return $str;
//    }
//
//    /**
//     *  作用：产生随机字符串，不长于32位
//     */
//    public function randomkeys($length)
//    {
//        $pattern = '1234567890123456789012345678905678901234';
//        $key = null;
//
//        for ($i = 0; $i < $length; $i++)
//        {
//            $key .= $pattern{mt_rand(0, 30)};    //生成php随机数
//        }
//
//        return $key;
//    }
//
//    /**
//     * 将xml转为array
//     * @param string $xml
//     * @throws WxPayException
//     */
//    public function FromXml($xml)
//    {
//        //将XML转为array
//        return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
//    }
//
//    /**
//     * 输出xml字符
//     * @throws WxPayException
//     **/
//    public function ToXml($arr)
//    {
//        $xml = "<xml>";
//        foreach ($arr as $key => $val)
//        {
//            if (is_numeric($val))
//            {
//                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
//            }
//            else
//            {
//                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
//            }
//        }
//        $xml .= "</xml>";
//        return $xml;
//    }
//
//    /**
//     * 生成签名
//     * @return 签名，本函数不覆盖sign成员变量，如要设置签名需要调用SetSign方法赋值
//     */
//    protected function MakeSign($arr)
//    {
//        //签名步骤一：按字典序排序参数
//        ksort($arr);
//        $string = $this->ToUrlParams($arr);
//
//        //签名步骤二：在string后加入KEY
//        $string = $string . "&key=" . $this->makesign;
//
//        //签名步骤三：MD5加密
//        $string = md5($string);
//
//        //签名步骤四：所有字符转为大写
//        $result = strtoupper($string);
//
//        return $result;
//    }
//
//    /**
//     * 格式化参数格式化成url参数
//     */
//    protected function ToUrlParams($arr)
//    {
//        $buff = "";
//
//        foreach ($arr as $k => $v)
//        {
//            if ($k != "sign" && $v != "" && !is_array($v))
//            {
//                $buff .= $k . "=" . $v . "&";
//            }
//        }
//        $buff = trim($buff, "&");
//        return $buff;
//    }
//}